package inutan.common.kit;

public class PackIdKit {

    public static void main(String[] args) {
        test(1,(byte) 1);
        test(1,(byte) 2);

        test(2,(byte) 2);

        test(99999,(byte) 99);

        test(842397,(byte) 41);
    }

    public static void test(int packageId,byte mid) {
        int merge = merge(packageId,mid);
        System.err.println(merge + " & " + getPackageId(merge) + " & " + getMid(merge));
    }

    /**
     * 合并两个参数,分别存放在 [高24 和 低8]
     * <pre>
     *     packageId - 高24
     *     mid - 低8
     *     例如 packageId = 1; mid = 1;
     *     mergeId 的结果: 257
     *     那么 mergeId 对应的二进制是: [0000 0000 0000 0000 0000 0001] [0000 0001]
     * </pre>
     *
     * @param packageId    模块ID由存放于合并结果的高16位, 该参数不得大于 32767
     * @param mid  节点ID存放于合并结果的低16位, 该参数不得大于 65535
     * @return 合并的结果
     */
    public static int merge(int packageId, byte mid) {
        return (packageId << 8) + mid;
    }

    /**
     * 得到请求包ID
     * 从 mergeId 中获取 [高24位] 的数值
     *
     * @param merge 合并路由 mergeId
     * @return [高24位] 的数值
     */
    public static int getPackageId(int merge) {
        return merge >> 8;
    }

    /**
     * 得到消息包ID
     * 从 merge 中获取 [低8位] 的数值
     *
     * @return [低8位] 的数值
     */
    public static int getMid(int merge) {
        return merge & 0xFF;
    }
}
